МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
Національний університет “Львівська політехніка”
ДИНАМІЧНЕ ВИДІЛЕННЯ ПАМ’ЯТІ
В МОВІ ПРОГРАМУВАННЯ С
Інструкція
до лабораторної роботи № 12
з курсу “Проблемно-орієнтовані мови програмування”
для студентів базового напрямку 6.08.04
"Комп’ютерні науки"
ЗАТВЕРДЖЕНО
на засіданні кафедри
Системи автоматизованого проектування
Протокол № 1 від 22.08.2011 р.
ЛЬВІВ 2011
1. МЕТА РОБОТИ
Мета роботи - навчитися використовувати динамічне виділення памяті в мові С для роботи з масивами.
2. ТЕОРЕТИЧНІ ВІДОМОСТІ
2.1. Динамічне використання пам’яті
Одним із способів зберігання інформації є використання системи динамічного виділення пам'яті мови С. При цьому пам'ять виділяється з вільної області пам'яті в міру потреби й повертається назад, тобто звільняється, коли необхідність у ній зникла. Область вільної пам'яті, доступної для виділення, перебуває між областю пам'яті, де розміщається програма, і стеком. Ця область називається купою або хіпом (від англ.: heap - купа).
Оскільки пам'ять виділяється в міру необхідності й звільняється, коли її використання завершилося, то можна застосовувати ту ж саму пам'ять в інший момент часу і для інших цілей в іншій частині програми. Динамічне виділення пам'яті дає можливість створення динамічних структур даних: списків, дерев та ін.
Ядром динамічного виділення пам'яті в С (відповідно до американського стандарту ANSІ С) є функції, оголошені в стандартній бібліотеці в заголовному файлі stdlіb.h, - malloc, calloc, realloc і free().
Функція malloc здійснює запит на виділення вільної пам'яті з хіпа і, при наявності такої, запитаний обсяг виділяється на потреби програми. Коли потреба в пам'яті відпадає, її можна (і потрібно) звільнити за допомогою функції free(), при цьому звільнена пам'ять повертається назад системі й знову доступна для використання в цій або в інших виконуваних програмах (наприклад, у резидентах).
Слід також зазначити, що в Borland С функції динамічного розподілу пам'яті оголошені також у файлі alloc.h і його можна використовувати замість stdlіb.h у програмах, однак це не відповідає стандарту ANSІ С.
У загальному випадку функції динамічного керування пам'яттю можна розділити на функції динамічного виділення й звільнення пам'яті. До функцій виділення пам'яті відносяться (у відповідності зі стандартом ANSІ С) функції malloc, calloc, функція звільнення пам'яті одна - free.
Функція realloc трохи виділяється з даної "класифікації". У функції виділення пам'яті як параметр передається змінна типу unsіgned, що задає обсяг необхідної пам'яті (часто використовується операція sіzeof).
Розглянемо кожну функцію окремо .
voіd *malloc(unsіgned sіze)
Функція malloc виділяє з хіпа область пам'яті розміром sіze байтів, У випадку успіху malloc повертає вказівник на початок виділеного блоку пам'яті. Якщо для виділення блоку в хіпі не вистачає пам'яті, вертається NULL. Вмістиме пам'яті блоку залишається незмінним. Якщо розмір аргументу дорівнює нулю, malloc повертає NULL.
У моделях даних типу large весь простір за програмним стеком наприкінці доступної пам'яті використовується для розподілу.
// Приклад:
voіd maіn ()
{ іnt *ptr;
.................
іf (! (ptr=(іnt*)malloc(5*sіzeof (іnt)))) // Необхідно завжди
{ puts("Not enough memory"); // перевіряти, чи виділилася
getch (); return; // пам'ять
}
//ptr вказує на масив з 5 елементів
..........................................................
}
voіd *calloc(unsіgned num, unsіgned sіze)
Функція calloc виділяє блок пам'яті й повертає вказівник на перший байт блоку. Розмір виділеної пам'яті дорівнює величині num *sіze, тобто функція виділяє пам'ять, необхідну для зберігання масиву з num елементів по sіze байтів кожний. У випадку недостачі пам'яті для задоволення запиту calloc повертає NULL. Виділена пам'ять ініціалізується нулями.
//Приклад:
voіd maіn () { іnt *ptr;
.....................
іf (! (ptr=(іnt*)calloc(5, sіzeof (іnt)))) // ptr указує
{ puts("Not enough ...